/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente;

import Entidades.Curso;
import Entidades.Alumno;
import Entidades.Asignacion;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author JeSs
 */
public class Cliente {
    
    private static final int PUERTO = 6000;
    private Socket socket = null;
    private ObjectOutputStream oos = null;
    private ObjectInputStream ois = null;
   
    
    public Cliente(){
        try {
            //Se inicializa la conexión
            socket = new Socket("localhost", PUERTO);
            System.out.println("Estoy conectado");
            oos =  new ObjectOutputStream(socket.getOutputStream());
            oos.flush();
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    public List<Alumno> recibirAlumnos()
    {
        enviarEntero(Constantes.ALUMNO);
        enviarEntero(Constantes.CONSULTAR_TODOS);
        List<Alumno> resultados = new ArrayList<Alumno>();
        try {
            resultados = (List<Alumno>) ois.readObject();
        }catch (IOException | ClassNotFoundException e){
        }
        return resultados;
    }
    
    public Alumno recibirAlumno(int identificador)
    {
        Alumno alumno = new Alumno();
        enviarEntero(Constantes.ALUMNO);
        System.out.println("Enviar el codigo para alumno");
        enviarEntero(Constantes.CONSULTAR_UNO);
        System.out.println("Enviar la operacion consultar uno");
        enviarEntero(identificador);
        System.out.println("envie el identificador " + identificador);
        try {
            alumno = (Alumno) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
        } finally{
            return alumno;
        }
    }
    
    public List<Curso> recibirCursos()
    {
        enviarEntero(Constantes.CURSO);
        enviarEntero(Constantes.CONSULTAR_TODOS);
        List<Curso> resultados = new ArrayList<Curso>();
        try {
            resultados = (List<Curso>) ois.readObject();
        }catch (IOException | ClassNotFoundException e){
        }
        return resultados;
    }
    
    public Curso recibirCurso(int identificador)
    {
        Curso curso = new Curso();
        enviarEntero(Constantes.CURSO);
        System.out.println("Enviar el codigo para curso");
        enviarEntero(Constantes.CONSULTAR_UNO);
        System.out.println("Enviar la operacion consultar uno");
        enviarEntero(identificador);
        System.out.println("envie el identificador " + identificador);
        try {
            curso = (Curso) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
        } finally{
            return curso;
        }
    }
    
        public List<Asignacion> recibirAsignaciones(int idAlumno)
    {
        enviarEntero(Constantes.ASIGNACION);
        enviarEntero(Constantes.CONSULTAR_TODOS);
        enviarEntero(idAlumno);
        System.out.println("Envie el id " + idAlumno);
        List<Asignacion> resultados = new ArrayList<Asignacion>();
        try {
            resultados = (List<Asignacion>) ois.readObject();
        }catch (IOException | ClassNotFoundException e){
        }
        return resultados;
    }
    
    public Asignacion recibirAsignacion(int idCurso, int idAlumno)
    {
        Asignacion asignacion = new Asignacion();
        enviarEntero(Constantes.ASIGNACION);
        System.out.println("Enviar el codigo para curso");
        enviarEntero(Constantes.CONSULTAR_UNO);
        System.out.println("Enviar la operacion consultar uno");
        enviarEntero(idCurso);
        enviarEntero(idAlumno);
        try {
            asignacion = (Asignacion) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
        } finally{
            return asignacion;
        }
    }
    
    
    
    
    
    
    public void enviarEntero(int numero)
    {
        try {
            oos.writeInt(numero);
            oos.flush();
        } catch (Exception e) {
        }   
    }

    public boolean agregarNuevo(Object objeto, int tipoEntidad)
    {
        System.out.println("Entre al metodo");
        try{
            oos.writeInt(tipoEntidad);
            oos.writeInt(Constantes.AGREGAR);
            switch (tipoEntidad){
                case Constantes.ALUMNO:
                    System.out.println("Agregare un alumno");
                    Alumno alumno = (Alumno) objeto;
                    System.out.println("Castee el objeto");
                    oos.writeObject(alumno);
                    System.out.println("Escribi el objeto");
                    break;

                case Constantes.ASIGNACION:            
                    Asignacion asignacion = (Asignacion) objeto;
                    oos.writeObject(asignacion);
                    break;

                case Constantes.CURSO:
                    Curso curso = (Curso) objeto;
                    oos.writeObject(curso);         
                    break;
              }      
            oos.flush();
            return ois.readBoolean();
        } catch (IOException ioe){
            return false;
        }
    }
    
    public boolean modificar(Object objeto, int tipoEntidad)
    {
        boolean respuesta = false;   
        enviarEntero(tipoEntidad);
        enviarEntero(Constantes.MODIFICAR);
        try {
            switch (tipoEntidad){
                case Constantes.ALUMNO:
                    System.out.println("Agregare un alumno");
                    Alumno alumno = (Alumno) objeto;
                    System.out.println("Castee el objeto");
                    oos.writeObject(alumno);
                    System.out.println("Escribi el objeto");
                    break;

                case Constantes.ASIGNACION:            
                    Asignacion asignacion = (Asignacion) objeto;
                    oos.writeObject(asignacion);
                    break;

                case Constantes.CURSO:
                    Curso curso = (Curso) objeto;
                    oos.writeObject(curso);         
                    break;
            }      
            oos.flush();
            respuesta = ois.readBoolean();
        } catch (Exception e) {
            respuesta = false;
        } finally {
            return respuesta;
        }
        
      
    }
    
    public boolean eliminar(int identificador, int tipoEntidad)
    {
        boolean respuesta = false;
        enviarEntero(tipoEntidad);
        enviarEntero(Constantes.ELIMINAR);
        enviarEntero(identificador);
        try {
            respuesta = ois.readBoolean();
        } catch (Exception e) {
        }
        
        return respuesta;
    }
    
     
    //Cierra los flujos y la conexión del socket
    public void cerrarConexion()
    {
        try {
            socket.close();
            ois.close();
            oos.close();
        } catch (Exception e) {
        }
        
    }

}
